package org.com.repair.repository;

import java.util.Date;
import java.util.List;

import org.com.repair.entity.Feedback;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface FeedbackRepository extends JpaRepository<Feedback, Long> {
    
    /**
     * 根据维修工单ID查找反馈列表
     * @param repairOrderId 维修工单ID
     * @return 反馈列表
     */
    List<Feedback> findByRepairOrderId(Long repairOrderId);
    
    /**
     * 根据用户ID查找反馈列表
     * @param userId 用户ID
     * @return 反馈列表
     */
    List<Feedback> findByUserId(Long userId);
    
    /**
     * 根据评分范围查找反馈列表
     * @param minRating 最低评分
     * @param maxRating 最高评分
     * @return 反馈列表
     */
    List<Feedback> findByRatingBetween(Integer minRating, Integer maxRating);
    
    /**
     * 查找指定日期范围内的反馈列表
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 反馈列表
     */
    List<Feedback> findByCreatedAtBetween(Date startDate, Date endDate);
    
    /**
     * 计算维修工单的平均评分
     * @param repairOrderId 维修工单ID
     * @return 平均评分
     */
    @Query("SELECT AVG(f.rating) FROM Feedback f WHERE f.repairOrder.id = :repairOrderId")
    Double calculateAverageRating(@Param("repairOrderId") Long repairOrderId);
    
    /**
     * 计算技师的平均评分
     * @param technicianId 技师ID
     * @return 平均评分
     */
    @Query("SELECT AVG(f.rating) FROM Feedback f " +
           "JOIN f.repairOrder r " +
           "JOIN r.technicians t " +
           "WHERE t.id = :technicianId")
    Double calculateTechnicianAverageRating(@Param("technicianId") Long technicianId);
    
    /**
     * 查找包含特定关键词的反馈列表
     * @param keyword 关键词
     * @return 反馈列表
     */
    List<Feedback> findByCommentContaining(String keyword);
    
    /**
     * 获取反馈评分的分布统计
     * @return 统计结果（评分、数量、百分比）
     */
    @Query("SELECT f.rating, COUNT(f), COUNT(f) * 100.0 / (SELECT COUNT(f2) FROM Feedback f2) " +
           "FROM Feedback f " +
           "GROUP BY f.rating " +
           "ORDER BY f.rating DESC")
    List<Object[]> getRatingDistribution();
} 